home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / toollib / source / freq.s < prev    next >
Text File  |  1995-12-30  |  59KB  |  2,093 lines

  1.         opt     l+,o+,ow-
  2. *
  3. * freq.s version 8.1 - © Copyright 1990 Jaba Development
  4. *
  5. * Author    : Jan van den Baard
  6. * Assembler : Devpac version 2.14
  7. *
  8.         incdir  'sys:devpac_inc/'
  9.         include 'tool.i'
  10.         include 'mymacros.i'
  11.         include 'exec/exec_lib.i'
  12.         include 'intuition/intuition_lib.i'
  13.         include 'graphics/graphics_lib.i'
  14.         include 'libraries/dos_lib.i'
  15. *
  16. * external symbol references
  17. *
  18.         xref    _DOSBase
  19.         xref    _IntuitionBase
  20.         xref    _GfxBase
  21.  
  22.         xref    ShadowGList
  23.         xref    InitMemoryChain
  24.         xref    AllocItem
  25.         xref    FreeItem
  26.         xref    FreeMemoryChain
  27.         xref    StrCpy
  28.         xref    StrLen
  29.         xref    StriCmp
  30.         xref    BstrToCstr
  31.         xref    MatchPattern
  32.         xref    Isolate
  33.         xref    CreateTimeDelay
  34.         xref    DoTimeDelay
  35.         xref    DeleteTimeDelay
  36.         xref    QuickSort
  37.         xref    OpenDir
  38.         xref    GetEntry
  39.         xref    CloseDir
  40.         xref    FreeDir
  41.         xref    IoErrToStr
  42.  
  43. *
  44. * This is the way data gets passed around ! This structure gets dynamicaly
  45. * allocated each time the filerequester is called.
  46. *
  47.     STRUCTURE    Global,0
  48.         APTR    gl_Freq
  49.         APTR    gl_WindowLock
  50.         APTR    gl_Window
  51.         APTR    gl_PRWindow
  52.         APTR    gl_RPort
  53.         APTR    gl_IAddress
  54.         APTR    gl_Prop
  55.         APTR    gl_FileG
  56.         APTR    gl_DirG
  57.         APTR    gl_Disk
  58.         APTR    gl_Drawer
  59.         APTR    gl_PInfo
  60.         APTR    gl_Font
  61.         APTR    gl_Proc
  62.         APTR    gl_FirstDisplayed
  63.         APTR    gl_TimeDelay
  64.         STRUCT  gl_Misc,mc_SIZEOF
  65.         ULONG   gl_IsNext
  66.         ULONG   gl_Displayed
  67.         ULONG   gl_Class
  68.         USHORT  gl_Code
  69.         USHORT  gl_Qualifier
  70.         USHORT  gl_Id
  71.         USHORT  gl_NumEntries
  72.         USHORT  gl_IsSorted
  73.         APTR    gl_FileBuf
  74.         APTR    gl_DrawerBuf
  75.         STRUCT  gl_Pattern,32
  76.         LABEL   gl_SIZEOF
  77.  
  78. *
  79. * Draw a box in a rastport.
  80. * This routine is used to draw the gadget and requester borders.
  81. *
  82. _Box:       movem.l d2-d6/a2/a6,-(sp)
  83.             move.l  32(sp),a2
  84.             movem.l 36(sp),d2-d6
  85.             move.l  _GfxBase,a6
  86.             move.l  a2,a1
  87.             move.l  d6,d0
  88.             libcall SetAPen
  89.             move.l  a2,a1
  90.             moveq   #RP_JAM1,d0
  91.             libcall SetDrMd
  92.             move.l  a2,a1
  93.             move.l  d2,d0
  94.             move.l  d3,d1
  95.             libcall Move
  96.             move.l  d2,d0
  97.             add.l   d4,d0
  98.             move.l  d3,d1
  99.             libcall Draw
  100.             move.l  d2,d0
  101.             add.l   d4,d0
  102.             move.l  d3,d1
  103.             add.l   d5,d1
  104.             libcall Draw
  105.             move.l  d2,d0
  106.             move.l  d3,d1
  107.             add.l   d5,d1
  108.             libcall Draw
  109.             move.l  d2,d0
  110.             move.l  d3,d1
  111.             libcall Draw
  112.             movem.l (sp)+,d2-d6/a2/a6
  113.             rts
  114. *
  115. * Print a text in a rastport.
  116. * This routine is used to print the gadget & requester texts.
  117. *
  118. _Print:     movem.l d2-d6/a2-a3/a6,-(sp)
  119.             movem.l 36(sp),a2-a3
  120.             movem.l 44(sp),d2-d6
  121.             move.l  _GfxBase,a6
  122.             move.l  a2,a1
  123.             move.l  d4,d0
  124.             libcall SetAPen
  125.             move.l  a2,a1
  126.             move.l  d5,d0
  127.             libcall SetBPen
  128.             move.l  a2,a1
  129.             move.l  d6,d0
  130.             libcall SetDrMd
  131.             move.l  a2,a1
  132.             move.l  d2,d0
  133.             move.l  d3,d1
  134.             addq.l  #6,d1
  135.             libcall Move
  136.             move.l  a2,a1
  137.             move.l  a3,a0
  138.             bsr     StrLen
  139.             move.l  a3,a0
  140.             libcall Text
  141.             movem.l (sp)+,d2-d6/a2/a3/a6
  142.             rts
  143. *
  144. * (re)set the user colors (only if FR_CustColor was set in the Flags field
  145. * of the FileRequester structure).
  146. *
  147. _DoColors:  movem.l d2-d5/a2-a3/a5/a6,-(sp)
  148.             move.l  36(sp),a2
  149.             move.l  gl_Window(a2),a0
  150.             move.l  _IntuitionBase,a6
  151.             libcall ViewPortAddress
  152.             move.l  d0,a3
  153.             move.l  gl_Freq(a2),a5
  154.             lea.l   fr_Color0(a5),a5
  155.             move.l  _GfxBase,a6
  156.             cldat   d4
  157. ColorLoop:  move.l  d4,d0
  158.             move.l  vp_ColorMap(a3),a0
  159.             libcall GetRGB4
  160.             move.l  d0,d5
  161.             move.l  d4,d0
  162.             add.l   d0,d0
  163.             cldat   d1
  164.             move.w  (a5,d0.l),d1
  165.             move.l  a3,a0
  166.             move.l  d1,d2
  167.             move.l  d1,d3
  168.             asr.l   #8,d1
  169.             asr.l   #4,d2
  170.             and.l   #15,d1
  171.             and.l   #15,d2
  172.             and.l   #15,d3
  173.             move.l  d4,d0
  174.             libcall SetRGB4
  175.             move.l  d4,d0
  176.             add.l   d0,d0
  177.             move.w  d5,(a5,d0.l)
  178.             inc.l   d4
  179.             cmp.l   #4,d4
  180.             beq.s   NoMoreCol
  181.             bra.s   ColorLoop
  182. NoMoreCol:  movem.l (sp)+,d2-d5/a2-a3/a5/a6
  183.             rts
  184. *
  185. * Open and setup the filerequester window.
  186. *
  187. _GetFSWindow:
  188.             movem.l d2-d3/a2-a3/a5-a6,-(sp)
  189.             move.l  28(sp),a2
  190.             move.l  #nw_SIZE,d0
  191.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  192.             lea.l   gl_Misc(a2),a0
  193.             bsr     AllocItem
  194.             move.l  d0,a5
  195.             bne.s   GotNW
  196. NoOpen:     cldat   d0
  197. EndGFSW:    movem.l (sp)+,d2-d3/a2-a3/a5-a6
  198.             rts
  199. GotNW:      lea.l   fsnw,a0
  200.             move.l  a5,a1
  201.             move.l  #nw_SIZE,d0
  202.             libcall CopyMem
  203.             move.l  gl_Freq(a2),a0
  204.             move.w  fr_LeftEdge(a0),d0
  205.             move.w  d0,nw_LeftEdge(a5)
  206.             move.w  fr_TopEdge(a0),d0
  207.             move.w  d0,nw_TopEdge(a5)
  208.             move.l  fr_Screen(a0),d0
  209.             move.l  d0,nw_Screen(a5)
  210.             beq.s   NoScreen
  211.             move.w  #CUSTOMSCREEN,nw_Type(a5)
  212.             bra.s   HaveScreen
  213. NoScreen:   move.w  #WBENCHSCREEN,nw_Type(a5)
  214. HaveScreen: lea.l   TOPAZ_80,a0
  215.             move.l  _GfxBase,a6
  216.             libcall OpenFont
  217.             move.l  d0,gl_Font(a2)
  218.             move.l  a5,a0
  219.             move.l  _IntuitionBase,a6
  220.             libcall OpenWindow
  221.             move.l  d0,-(sp)
  222.             move.l  a5,a1
  223.             move.l  #nw_SIZE,d0
  224.             lea.l   gl_Misc(a2),a0
  225.             bsr     FreeItem
  226.             move.l  (sp)+,d0
  227.             tst.l   d0
  228.             bne.s   OpenOK
  229.             bra.s   NoOpen
  230. OpenOK:     move.l  d0,gl_Window(a2)
  231.             move.l  gl_Freq(a2),a0
  232.             move.w  fr_Flags(a0),d0
  233.             btst    #3,d0
  234.             beq.s   NoCols
  235.             move.l  a2,-(sp)
  236.             bsr     _DoColors
  237.             addq.w  #4,sp
  238. NoCols:     move.l  gl_Window(a2),a0
  239.             move.l  wd_RPort(a0),a3
  240.             move.l  a3,gl_RPort(a2)
  241.             move.l  a3,a1
  242.             move.l  gl_Font(a2),a0
  243.             move.l  _GfxBase,a6
  244.             libcall SetFont
  245.             move.l  a2,-(sp)
  246.             move.l  gl_Window(a2),a0
  247.             move.l  gl_Freq(a2),a1
  248.             move.l  fr_HeadLine(a1),a1
  249.             move.l  #-1,a2
  250.             move.l  _IntuitionBase,a6
  251.             libcall SetWindowTitles
  252.             move.l  (sp)+,a2
  253.             move.l  _GfxBase,a6
  254.             move.l  a3,a1
  255.             moveq   #1,d0
  256.             libcall SetAPen
  257.             move.l  a3,a0
  258.             cldat   d0
  259.             move.l  #10,d1
  260.             move.l  #260,d2
  261.             move.l  #140,d3
  262.             libcall RectFill
  263.             pea     2
  264.             pea     44
  265.             pea     253
  266.             pea     93
  267.             pea     3
  268.             move.l  a3,-(sp)
  269.             bsr     _Box
  270.             lea.l   24(sp),sp
  271.             pea     2
  272.             pea     81
  273.             pea     21
  274.             pea     11
  275.             pea     235
  276.             move.l  a3,-(sp)
  277.             bsr     _Box
  278.             lea.l   24(sp),sp
  279.             pea     0
  280.             pea     59
  281.             pea     15
  282.             pea     22
  283.             pea     238
  284.             move.l  a3,-(sp)
  285.             bsr     _Box
  286.             lea.l   24(sp),sp
  287.             pea     2
  288.             pea     81
  289.             pea     231
  290.             pea     11
  291.             pea     3
  292.             move.l  a3,-(sp)
  293.             bsr     _Box
  294.             lea.l   24(sp),sp
  295.             pea     2
  296.             pea     128
  297.             pea     255
  298.             pea     10
  299.             pea     2
  300.             move.l  a3,-(sp)
  301.             bsr     _Box
  302.             lea.l   24(sp),sp
  303.             pea     2
  304.             pea     12
  305.             pea     69
  306.             pea     121
  307.             pea     179
  308.             move.l  a3,-(sp)
  309.             bsr     _Box
  310.             lea.l   24(sp),sp
  311.             pea     2
  312.             pea     12
  313.             pea     69
  314.             pea     121
  315.             pea     95
  316.             move.l  a3,-(sp)
  317.             bsr     _Box
  318.             lea.l   24(sp),sp
  319.             pea     2
  320.             pea     12
  321.             pea     69
  322.             pea     121
  323.             pea     11
  324.             move.l  a3,-(sp)
  325.             bsr     _Box
  326.             lea.l   24(sp),sp
  327.             pea     2
  328.             pea     9
  329.             pea     185
  330.             pea     108
  331.             pea     63
  332.             move.l  a3,-(sp)
  333.             bsr     _Box
  334.             lea.l   24(sp),sp
  335.             pea     2
  336.             pea     9
  337.             pea     185
  338.             pea     96
  339.             pea     63
  340.             move.l  a3,-(sp)
  341.             bsr     _Box
  342.             lea.l   24(sp),sp
  343.             pea     0
  344.             pea     0
  345.             pea     2
  346.             pea     124
  347.             pea     191
  348.             pea     cancel
  349.             move.l  a3,-(sp)
  350.             bsr     _Print
  351.             lea.l   28(sp),sp
  352.             pea     0
  353.             pea     0
  354.             pea     2
  355.             pea     124
  356.             pea     107
  357.             pea     parent
  358.             move.l  a3,-(sp)
  359.             bsr     _Print
  360.             lea.l   28(sp),sp
  361.             pea     0
  362.             pea     0
  363.             pea     2
  364.             pea     124
  365.             pea     38
  366.             pea     oktext
  367.             move.l  a3,-(sp)
  368.             bsr     _Print
  369.             lea.l   28(sp),sp
  370.             pea     0
  371.             pea     0
  372.             pea     2
  373.             pea     109
  374.             pea     11
  375.             pea     file
  376.             move.l  a3,-(sp)
  377.             bsr     _Print
  378.             lea.l   28(sp),sp
  379.             pea     0
  380.             pea     0
  381.             pea     2
  382.             pea     97
  383.             pea     11
  384.             pea     drawer
  385.             move.l  a3,-(sp)
  386.             bsr     _Print
  387.             lea.l   28(sp),sp
  388.             move.l  a2,-(sp)
  389.             bsr     _DoGadgets
  390.             addq.w  #4,sp
  391.             tst.l   d0
  392.             bne.s   GadgetsOK
  393.             move.l  gl_Window(a2),a0
  394.             move.l  _IntuitionBase,a6
  395.             libcall CloseWindow
  396.             bra     NoOpen
  397. GadgetsOK:  cladr   a1
  398.             move.l  _SysBase,a6
  399.             libcall FindTask
  400.             move.l  d0,a0
  401.             move.l  pr_WindowPtr(a0),gl_PRWindow(a2)
  402.             move.l  gl_Window(a2),pr_WindowPtr(a0)
  403.             move.l  a0,gl_Proc(a2)
  404.             moveq   #1,d0
  405.             bra     EndGFSW
  406.  
  407. *
  408. * allocate and setup the requester gadgets
  409. *
  410. _DoGadgets: movem.l d2-d7/a2-a3/a6,-(sp)
  411.             move.l  40(sp),a2
  412.             lea.l   gl_Misc(a2),a3
  413.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  414.             move.l  #16*gg_SIZEOF,d0
  415.             move.l  a3,a0
  416.             bsr     AllocItem
  417.             move.l  d0,d2
  418.             beq     NoMemory
  419.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  420.             move.l  #5*ig_SIZEOF,d0
  421.             move.l  a3,a0
  422.             bsr     AllocItem
  423.             move.l  d0,d3
  424.             beq     NoMemory
  425.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  426.             moveq   #pi_SIZEOF,d0
  427.             move.l  a3,a0
  428.             bsr     AllocItem
  429.             move.l  d0,d4
  430.             beq     NoMemory
  431.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  432.             move.l  #2*si_SIZEOF,d0
  433.             move.l  a3,a0
  434.             bsr     AllocItem
  435.             move.l  d0,d5
  436.             beq     NoMemory
  437.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  438.             move.l  #256,d0
  439.             move.l  a3,a0
  440.             bsr     AllocItem
  441.             move.l  d0,d6
  442.             beq     NoMemory
  443.             move.l  #MEMF_CHIP+MEMF_CLEAR,d1
  444.             move.l  #176,d0
  445.             move.l  a3,a0
  446.             bsr     AllocItem
  447.             move.l  d0,d7
  448.             beq     NoMemory
  449.             move.l  (_SysBase).w,a6
  450.             lea.l   FSG,a0
  451.             move.l  d2,a1
  452.             move.l  #8*gg_SIZEOF,d0
  453.             libcall CopyMem
  454.             cldat   d0
  455.             move.l  d2,a0
  456. GLoop1:     move.l  a0,gg_NextGadget(a0)
  457.             add.l   #gg_SIZEOF,gg_NextGadget(a0)
  458.             add.l   #gg_SIZEOF,a0
  459.             inc.l   d0
  460.             cmp.l   #8,d0
  461.             bne.s   GLoop1
  462.             move.w  #12,d1
  463. GLoop2:     movem.l d0/d1/a0,-(sp)
  464.             move.l  a0,a1
  465.             lea.l   FGAD,a0
  466.             move.l  #gg_SIZEOF,d0
  467.             libcall CopyMem
  468.             movem.l (sp)+,d0/d1/a0
  469.             move.l  a0,gg_NextGadget(a0)
  470.             add.l   #gg_SIZEOF,gg_NextGadget(a0)
  471.             move.w  d1,gg_TopEdge(a0)
  472.             addq.w  #2,d1
  473.             addq.w  #8,d1
  474.             move.w  d0,gg_GadgetID(a0)
  475.             add.l   #gg_SIZEOF,a0
  476.             inc.l   d0
  477.             cmp.l   #16,d0
  478.             bne.s   GLoop2
  479.             clr.l   gg_NextGadget(a0)
  480.             lea.l   FSI,a0
  481.             move.l  d3,a1
  482.             move.l  #ig_SIZEOF*4,d0
  483.             libcall CopyMem
  484.             lea.l   FSD,a0
  485.             move.l  d7,a1
  486.             move.l  #176,d0
  487.             libcall CopyMem
  488.             move.l  d3,a0
  489.             move.l  d7,ig_ImageData(a0)
  490.             add.l   #ig_SIZEOF,a0
  491.             move.l  d7,d0
  492.             add.l   #16,d0
  493.             move.l  d0,ig_ImageData(a0)
  494.             add.l   #ig_SIZEOF,a0
  495.             move.l  d7,d0
  496.             add.l   #80,d0
  497.             move.l  d0,ig_ImageData(a0)
  498.             add.l   #ig_SIZEOF,a0
  499.             move.l  d7,d0
  500.             add.l   #32,d0
  501.             move.l  d0,ig_ImageData(a0)
  502.             move.l  d3,d0
  503.             add.l   #2*ig_SIZEOF,d0
  504.             move.l  d0,gl_Disk(a2)
  505.             add.l   #ig_SIZEOF,d0
  506.             move.l  d0,gl_Drawer(a2)
  507.             move.l  d2,a0
  508.             add.l   #6*gg_SIZEOF,a0
  509.             move.l  d3,gg_GadgetRender(a0)
  510.             add.l   #gg_SIZEOF,a0
  511.             move.l  d3,d0
  512.             add.l   #ig_SIZEOF,d0
  513.             move.l  d0,gg_GadgetRender(a0)
  514.             move.l  d5,a0
  515.             move.l  d6,si_UndoBuffer(a0)
  516.             move.l  gl_DrawerBuf(a2),d0
  517.             move.l  d0,si_Buffer(a0)
  518.             move.w  #256,si_MaxChars(a0)
  519.             add.l   #si_SIZEOF,a0
  520.             move.l  d6,si_UndoBuffer(a0)
  521.             move.l  gl_FileBuf(a2),d0
  522.             move.l  d0,si_Buffer(a0)
  523.             move.w  #32,si_MaxChars(a0)
  524.             move.l  d2,a0
  525.             add.l   #3*gg_SIZEOF,a0
  526.             move.l  d5,d0
  527.             add.l   #si_SIZEOF,d0
  528.             move.l  d0,gg_SpecialInfo(a0)
  529.             move.l  a0,gl_FileG(a2)
  530.             add.l   #gg_SIZEOF,a0
  531.             move.l  d5,gg_SpecialInfo(a0)
  532.             move.l  a0,gl_DirG(a2)
  533.             lea.l   PINFO,a0
  534.             move.l  d4,a1
  535.             move.l  #pi_SIZEOF,d0
  536.             libcall CopyMem
  537.             move.l  d2,a0
  538.             add.l   #5*gg_SIZEOF,a0
  539.             move.l  d4,gg_SpecialInfo(a0)
  540.             move.l  d3,d0
  541.             add.l   #4*ig_SIZEOF,d0
  542.             move.l  d0,gg_GadgetRender(a0)
  543.             move.l  a0,gl_Prop(a2)
  544.             move.l  d4,gl_PInfo(a2)
  545.             move.l  a2,-(sp)
  546.             move.l  gl_Window(a2),a0
  547.             move.l  d2,a1
  548.             move.l  #-1,d0
  549.             move.l  #16,d1
  550.             cladr   a2
  551.             move.l  _IntuitionBase,a6
  552.             libcall AddGList
  553.             move.l  d2,a0
  554.             move.l  (sp),a1
  555.             move.l  gl_Window(a1),a1
  556.             cladr   a2
  557.             moveq   #8,d0
  558.             libcall RefreshGList
  559.             move.l  (sp)+,a2
  560.             moveq   #3,d1
  561.             cldat   d0
  562.             move.l  gl_Window(a2),a0
  563.             cladr   a2
  564.             move.l  d2,a1
  565.             bsr     ShadowGList
  566.             moveq   #1,d0
  567. EndDG:      movem.l (sp)+,d2-d7/a2-a3/a6
  568.             rts
  569. NoMemory:   lea.l   gl_Misc(a2),a0
  570.             bsr     FreeMemoryChain
  571.             cldat   d0
  572.             bra.s   EndDG
  573. *
  574. * calculate the prop position
  575. *
  576. _PPos:      movem.l d2/a2,-(sp)
  577.             move.l  12(sp),a2
  578.             move.l  gl_PInfo(a2),a0
  579.             cldat   d0
  580.             move.w  pi_VertPot(a0),d0
  581.             divs    pi_VertBody(a0),d0
  582.             swap    d0
  583.             clr.w   d0
  584.             swap    d0
  585.             move.l  d0,d2
  586.             addq.l  #7,d0
  587.             cldat   d1
  588.             move.w  gl_NumEntries(a2),d1
  589.             cmp.l   d1,d0
  590.             ble.s   CheckZero
  591.             subq.l  #8,d1
  592.             move.l  d1,d2
  593. CheckZero:  tst.l   d2
  594.             bge.s   NotZero
  595.             cldat   d2
  596. NotZero:    move.l  d2,d0
  597.             movem.l (sp)+,d2/a2
  598.             rts
  599. *
  600. * read an IDCMP message
  601. * return TRUE if a message was read and FALSE if not
  602. *
  603. _DoMsg:     movem.l a2-a3/a6,-(sp)
  604.             move.l  16(sp),a2
  605.             move.l  gl_Window(a2),a0
  606.             move.l  wd_UserPort(a0),a0
  607.             move.l  (_SysBase).w,a6
  608.             libcall GetMsg
  609.             move.l  d0,a3
  610.             tst.l   d0
  611.             bne.s   HaveMsg
  612.             cldat   d0
  613. EndDM:      movem.l (sp)+,a2-a3/a6
  614.             rts
  615. HaveMsg:    move.l  im_Class(a3),gl_Class(a2)
  616.             move.w  im_Code(a3),gl_Code(a2)
  617.             move.w  im_Qualifier(a3),gl_Qualifier(a2)
  618.             move.l  im_IAddress(a3),a0
  619.             move.l  a0,gl_IAddress(a2)
  620.             move.w  gg_GadgetID(a0),gl_Id(a2)
  621.             move.l  a3,a1
  622.             libcall ReplyMsg
  623.             moveq   #1,d0
  624.             bra.s   EndDM
  625. *
  626. * sort the names from the files, dirs and devices
  627. *
  628. _SortNames: movem.l d2-d5/a2/a6,-(sp)
  629.             move.l  28(sp),a2
  630.             move.l  dr_NumEntries(a2),d2        ; number of entries in d2
  631.             cmp.l   #1,d2                       ; only sort if bigger than 1
  632.             bhi.s   NotEmpty
  633. NoSRT:      cldat   d0
  634. EndSN:      movem.l (sp)+,d2-d5/a2/a6
  635.             rts
  636. NotEmpty:   moveq   #ei_SIZEOF-8,d5
  637.             mulu    d2,d5                       ; allocate buffer
  638. SetUp:      move.l  (_SysBase).w,a6
  639.             move.l  d5,d0
  640.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  641.             libcall AllocMem
  642.             move.l  d0,d3
  643.             move.l  d0,d4
  644.             bne.s   GotMem
  645.             bra.s   NoSRT
  646. GotMem:     move.l  dr_First(a2),a0
  647. MemLoop:    move.l  a0,-(sp)
  648.             addq.w  #8,a0                       ; skip the list muck!
  649.             move.l  d4,a1
  650.             move.l  #ei_SIZEOF-8,d0
  651.             libcall CopyMemQuick
  652.             move.l  (sp)+,a0
  653.             cmp.l   dr_Last(a2),a0
  654.             beq.s   AllCopied
  655.             move.l  ei_Next(a0),a0
  656.             add.l   #ei_SIZEOF-8,d4
  657.             bra.s   MemLoop
  658. AllCopied:  lea.l   _compare,a1
  659.             moveq   #ei_SIZEOF-8,d1
  660.             move.l  d2,d0
  661.             move.l  d3,a0
  662.             bsr     QuickSort                   ; sort it out
  663.             move.l  d3,d4
  664.             move.l  dr_First(a2),a1
  665. BackLoop:   move.l  a1,-(sp)
  666.             addq.w  #8,a1
  667.             move.l  d4,a0
  668.             move.l  #ei_SIZEOF-8,d0
  669.             libcall CopyMemQuick
  670.             move.l  (sp)+,a1
  671.             cmp.l   dr_Last(a2),a1
  672.             beq.s   AllBack
  673.             move.l  ei_Next(a1),a1
  674.             add.l   #ei_SIZEOF-8,d4
  675.             bra.s   BackLoop
  676. AllBack:    move.l  d3,a1
  677.             move.l  d5,d0
  678.             libcall FreeMem
  679.             moveq   #1,d0
  680.             bra     EndSN
  681.  
  682. *
  683. * the comparrison routine for "QuickSort"
  684. *
  685. _compare:   cmp.w   #ENTRY_DEV,ei_Type-8(a0)
  686.             bne.s   NotDev
  687.             cmp.w   #ENTRY_DEV,ei_Type-8(a1)
  688.             bne.s   Minus
  689. NotDev:     cmp.w   #ENTRY_DIR,ei_Type-8(a0)
  690.             bne.s   NotDir
  691.             cmp.w   #ENTRY_DIR,ei_Type-8(a1)
  692.             bne.s   Plus
  693. NotDir:     cmp.w   #ENTRY_FILE,ei_Type-8(a0)
  694.             bne.s   NotFile
  695.             cmp.w   #ENTRY_DEV,ei_Type-8(a1)
  696.             beq.s   Plus
  697. NotFile:    cmp.w   #ENTRY_FILE,ei_Type-8(a0)
  698.             bne.s   StrCMP
  699.             cmp.w   #ENTRY_DIR,ei_Type-8(a1)
  700.             beq.s   Minus
  701. StrCMP:     lea.l   ei_Name-8(a0),a0
  702.             lea.l   ei_Name-8(a1),a1
  703.             bsr     StriCmp
  704. Endcp:      rts
  705. Minus:      moveq   #-1,d0
  706.             bra.s   Endcp
  707. Plus:       moveq   #1,d0
  708.             bra.s   Endcp
  709.  
  710. *
  711. * read the mounted disk devices
  712. *
  713. _ReadDevs:  movem.l d2-d3/a2-a3/a6,-(sp)
  714.             move.l  24(sp),a2
  715.             cldat   d2
  716.             move.l  (_SysBase).w,a6
  717.             libcall Forbid
  718.             move.l  _DOSBase,a3
  719.             move.l  dl_Root(a3),a3
  720.             move.l  rn_Info(a3),a3
  721.             add.l   a3,a3
  722.             add.l   a3,a3
  723.             move.l  di_DevInfo(a3),a3
  724.             add.l   a3,a3
  725.             add.l   a3,a3
  726. DevLoop:    tst.l   dl_Type(a3)
  727.             bne.s   NotDisk
  728.             tst.l   dl_Task(a3)
  729.             beq.s   NotDisk
  730.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  731.             moveq   #ei_SIZEOF,d0
  732.             lea.l   dr_DirMem(a2),a0
  733.             bsr     AllocItem
  734.             move.l  d0,a1
  735.             beq.s   MemFail
  736.             move.l  d0,d3
  737.             inc.w   d2
  738.             lea.l   ei_Name(a1),a1
  739.             move.l  dl_Name(a3),a0
  740.             bsr     BstrToCstr
  741.             move.l  d3,a1
  742.             lea.l   ei_Name(a1),a0
  743. ELoop:      tst.b   (a0)+
  744.             bne.s   ELoop
  745.             dec.w   a0
  746.             move.b  #':',(a0)+
  747.             clr.b   (a0)
  748.             move.w  #ENTRY_DEV,ei_Type(a1)
  749.             inc.l   dr_NumEntries(a2)
  750.             move.l  a2,a0
  751.             move.l  d3,a1
  752.             ADDTAIL
  753. NotDisk:    move.l  dl_Next(a3),a3
  754.             exg     a3,d0
  755.             lsl.l   #2,d0
  756.             tst.l   d0
  757.             beq.s   NoMoreDevs
  758.             exg     d0,a3
  759.             bra.s   DevLoop
  760. NoMoreDevs: move.l  (_SysBase).w,a6
  761.             libcall Permit
  762.             move.l  d2,d0
  763. EndRD:      movem.l (sp)+,d2-d3/a2-a3/a6
  764.             rts
  765. MemFail:    move.l  (_SysBase).w,a6
  766.             libcall Permit
  767.             cldat   d0
  768.             bra.s   EndRD
  769.  
  770. *
  771. * put up a requester with an error message
  772. *
  773. _Error:     movem.l d2-d3/a2-a3/a6,-(sp)
  774.             move.l  (_SysBase).w,a6
  775.             move.l  #it_SIZEOF,d0
  776.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  777.             libcall AllocMem
  778.             move.l  d0,a0
  779.             bne.s   DoErr
  780. EndE:       movem.l (sp)+,d2-d3/a2-a3/a6
  781.             rts
  782. DoErr:      move.w  #6,it_LeftEdge(a0)
  783.             move.w  #4,it_TopEdge(a0)
  784.             lea.l   TOPAZ_80,a1
  785.             move.l  a1,it_ITextFont(a0)
  786.             move.l  a0,-(sp)
  787.             move.l  32(sp),a2
  788.             bne.s   DoReq
  789.             bsr     IoErrToStr
  790.             move.l  d0,a2
  791. DoReq:      move.l  (sp),a1
  792.             move.l  a2,it_IText(a1)
  793.             move.l  28(sp),a0
  794.             move.l  gl_Window(a0),a0
  795.             cladr   a2
  796.             lea.l   ok,a3
  797.             cldat   d0
  798.             cldat   d1
  799.             move.l  #320,d2
  800.             move.l  #47,d3
  801.             move.l  _IntuitionBase,a6
  802.             libcall AutoRequest
  803.             move.l  (sp)+,a1
  804.             move.l  #it_SIZEOF,d0
  805.             move.l  (_SysBase).w,a6
  806.             libcall FreeMem
  807.             bra     EndE
  808.  
  809. *
  810. * open up a directory for reading
  811. *
  812. _OpenUpDir: movem.l d2/a2-a3/a6,-(sp)
  813.             move.l  20(sp),a2
  814.             move.l  gl_Freq(a2),a3
  815.             move.l  fr_Directory(a3),a3
  816.             move.l  a3,a0
  817.             bsr     CloseDir
  818.             move.l  a3,a0
  819.             bsr     FreeDir
  820.             clr.l   gl_Displayed(a2)
  821.             clr.w   gl_NumEntries(a2)
  822.             clr.w   gl_IsSorted(a2)
  823.             movem.l d2-d5/a2,-(sp)
  824.             move.l  gl_Prop(a2),a0
  825.             move.l  gl_Window(a2),a1
  826.             cladr   a2
  827.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  828.             cldat   d1
  829.             cldat   d2
  830.             move.l  #$ffff,d3
  831.             move.l  #$ffff,d4
  832.             moveq   #1,d5
  833.             move.l  _IntuitionBase,a6
  834.             libcall NewModifyProp
  835.             movem.l (sp)+,d2-d5/a2
  836.             move.l  a3,a0
  837.             move.l  gl_DrawerBuf(a2),a1
  838.             bsr     OpenDir
  839.             tst.l   d0
  840.             bne.s   DirOK
  841.             bra.s   OPENERROR
  842. DirOK:      move.l  gl_Freq(a2),a0
  843.             move.w  fr_Flags(a0),d0
  844.             btst    #1,d0
  845.             bne.s   FNS
  846.             move.l  a3,-(sp)
  847.             bsr     _ReadDevs
  848.             addq.w  #4,sp
  849.             move.w  d0,gl_NumEntries(a2)
  850.             tst.l   d0
  851.             bne.s   FNS
  852.             pea     nomem
  853.             move.l  a2,-(sp)
  854.             bsr     _Error
  855.             addq.w  #8,sp
  856.             bra.s   OPENERROR
  857. FNS:        move.l  #1,gl_IsNext(a2)
  858. EndOD:      movem.l (sp)+,d2/a2-a3/a6
  859.             rts
  860. OPENERROR:  move.l  _IntuitionBase,a6
  861.             cladr   a0
  862.             libcall DisplayBeep
  863.             move.l  a3,a0
  864.             bsr     CloseDir
  865.             move.l  a3,a0
  866.             bsr     FreeDir
  867.             move.l  gl_Freq(a2),a0
  868.             move.w  fr_Flags(a0),d0
  869.             btst    #1,d0
  870.             bne.s   NoDvs
  871.             move.l  a3,-(sp)
  872.             bsr     _ReadDevs
  873.             addq.w  #4,sp
  874.             move.w  d0,gl_NumEntries(a2)
  875.             tst.l   d0
  876.             bne.s   NoDvs
  877.             pea     nomem
  878.             move.l  a2,-(sp)
  879.             bsr     _Error
  880.             addq.w  #8,sp
  881. NoDvs:      clr.l   gl_IsNext(a2)
  882.             move.l  a2,-(sp)
  883.             bsr     _SetProp
  884.             addq.w  #4,sp
  885.             pea     0
  886.             move.l  a2,-(sp)
  887.             bsr     _PrintDir
  888.             addq.w  #8,sp
  889.             bra.s   EndOD
  890.  
  891. *
  892. * read an entry of a directory
  893. *
  894. _GetNext:   movem.l d2-d3/a2-a3/a6,-(sp)
  895.             move.l  24(sp),a2
  896.             move.l  gl_Freq(a2),a0
  897.             move.l  fr_Directory(a0),d3
  898.             move.l  d3,a0
  899.             bsr     GetEntry
  900.             move.l  d0,a3
  901.             beq     NoNext
  902.  
  903.             moveq   #NO_CASE,d0
  904.             lea.l   gl_Pattern(a2),a1
  905.             lea.l   ei_Name(a3),a0
  906.             bsr     MatchPattern
  907.             tst.l   d0
  908.             beq     NoMatch
  909.             move.l  gl_Freq(a2),a1
  910.             move.l  fr_DontShow(a1),a0
  911.             bsr     StrLen
  912.             tst.l   d0
  913.             beq.s   NoNoShow
  914.  
  915.             moveq   #NO_CASE,d0
  916.             move.l  fr_DontShow(a1),a1
  917.             lea.l   ei_Name(a3),a0
  918.             bsr     MatchPattern
  919.             tst.l   d0
  920.             bne     NoMatch
  921.  
  922. NoNoShow:   move.l  gl_Freq(a2),a0
  923.             move.w  fr_Flags(a0),d0
  924.             btst    #7,d0
  925.             beq.s   NoNoInfo
  926.             moveq   #NO_CASE,d0
  927.             lea.l   ninfo,a1
  928.             lea.l   ei_Name(a3),a0
  929.             bsr     MatchPattern
  930.             tst.l   d0
  931.             bne     NoMatch
  932.  
  933. NoNoInfo:   add.w   #1,gl_NumEntries(a2)
  934.             move.l  a2,-(sp)
  935.             bsr     _SetProp
  936.             addq.w  #4,sp
  937.             add.l   #1,gl_Displayed(a2)
  938.             cmp.l   #9,gl_Displayed(a2)
  939.             bcc.s   NoDisp
  940.             move.l  a2,-(sp)
  941.             bsr     _PPos
  942.             addq.w  #4,sp
  943.             move.l  d0,-(sp)
  944.             move.l  a2,-(sp)
  945.             bsr     _PrintDir
  946.             addq.w  #8,sp
  947.             bra.s   NoDisp
  948. NoMatch:
  949.             move.l  a3,a1
  950.             REMOVE
  951.             move.l  d3,a0
  952.             move.l  a3,a1
  953.             sub.l   #1,dr_NumEntries(a0)
  954.             move.l  #ei_SIZEOF,d0
  955.             lea.l   dr_DirMem(a0),a0
  956.             bsr     FreeItem
  957. NoDisp:     move.l  #1,gl_IsNext(a2)
  958. EndGN:      movem.l (sp)+,d2-d3/a2-a3/a6
  959.             rts
  960. NoNext:
  961.             move.l  _DOSBase,a6
  962.             libcall IoErr
  963.             cmp.l   #ERROR_NO_MORE_ENTRIES,d0
  964.             beq.s   HaveAll
  965.             pea     0
  966.             move.l  a2,-(sp)
  967.             bsr     _Error
  968.             addq.w  #8,sp
  969.             bra.s   DIRERROR
  970. HaveAll:
  971. ULock:      move.l  d3,a0
  972.             bsr     CloseDir
  973. Clse:       clr.b   gl_Pattern(a2)
  974.             clr.l   gl_IsNext(a2)
  975.             move.l  a2,-(sp)
  976. MsgS:       bsr     _DoMsg
  977.             tst.l   d0
  978.             bne.s   MsgS
  979.             addq.w  #4,sp
  980.             cmp.l   #9,gl_Displayed(a2)
  981.             bcc.s   EndGN
  982.             move.l  a2,-(sp)
  983.             bsr     _PPos
  984.             addq.w  #4,sp
  985.             move.l  d0,-(sp)
  986.             move.l  a2,-(sp)
  987.             bsr     _PrintDir
  988.             addq.w  #8,sp
  989.             bra     EndGN
  990. DIRERROR:
  991.             move.l  _IntuitionBase,a6
  992.             cladr   a0
  993.             libcall DisplayBeep
  994.             move.l  d3,a0
  995.             bsr     CloseDir
  996.             move.l  d3,a0
  997.             bsr     FreeDir
  998.             move.l  gl_Freq(a2),a0
  999.             move.w  fr_Flags(a0),d0
  1000.             btst    #1,d0
  1001.             beq.s   Clse
  1002.             move.l  d3,-(sp)
  1003.             bsr     _ReadDevs
  1004.             addq.w  #4,sp
  1005.             move.w  d0,gl_NumEntries(a2)
  1006.             tst.l   d0
  1007.             bne.s   Clse
  1008.             pea     nomem
  1009.             move.l  a2,-(sp)
  1010.             bsr     _Error
  1011.             addq.w  #8,sp
  1012. NoDe:       bra     Clse
  1013.  
  1014. *
  1015. * set the proportional gadget according to the number of entries
  1016. *
  1017. _SetProp:   movem.l d2-d5/a2/a6,-(sp)
  1018.             move.l  28(sp),a2
  1019.             cldat   d4
  1020.             cldat   d2
  1021.             move.l  gl_PInfo(a2),a0
  1022.             move.w  pi_VertPot(a0),d2
  1023.             cmp.w   #8,gl_NumEntries(a2)
  1024.             bhi.s   NotSmall
  1025.             move.w  #$ffff,d4
  1026.             bra.s   SetIt
  1027. NotSmall:   cmp.w   #9,gl_NumEntries(a2)
  1028.             bne.s   NotEQ
  1029.             move.w  #$08000,d4
  1030.             bra.s   SetIt
  1031. NotEQ:      move.w  gl_NumEntries(a2),d0
  1032.             subq.w  #8,d0
  1033.             move.l  #$ffff,d4
  1034.             divu    d0,d4
  1035.             swap    d4
  1036.             clr.w   d4
  1037.             swap    d4
  1038. SetIt:      move.l  _IntuitionBase,a6
  1039.             move.l  gl_Prop(a2),a0
  1040.             move.l  gl_Window(a2),a1
  1041.             cladr   a2
  1042.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1043.             cldat   d1
  1044.             move.l  #$ffff,d3
  1045.             moveq   #1,d5
  1046.             libcall NewModifyProp
  1047. EndSPR:     movem.l (sp)+,d2-d5/a2/a6
  1048.             rts
  1049.  
  1050. *
  1051. * find a EntryInfo structure
  1052. *
  1053. _GetEntryInfo:
  1054.             movem.l d2-d3/a2,-(sp)
  1055.             move.l  16(sp),a2
  1056.             move.l  20(sp),d2
  1057.             move.l  dr_First(a2),a1
  1058.             bra.s   CGL
  1059. GLoop:      move.l  ei_Next(a1),a1
  1060. CGL:        dbra    d2,GLoop
  1061. HaveIt:     move.l  a1,d0
  1062. EndGMI:     movem.l (sp)+,d2-d3/a2
  1063.             rts
  1064.  
  1065. *
  1066. * set the frontpen
  1067. *
  1068. setpen:     move.l  _GfxBase,a6
  1069.             move.l  gl_RPort(a2),a1
  1070.             moveq   #1,d0
  1071.             libcall SetAPen
  1072.             rts
  1073. *
  1074. * print the directory
  1075. *
  1076. _PrintDir:  movem.l d2-d6/a2-a3/a5-a6,-(sp)
  1077.             move.l  40(sp),a2
  1078.             move.l  44(sp),d0
  1079.             tst.w   gl_NumEntries(a2)
  1080.             bne.s   HaveEnt
  1081. EndPD:      movem.l (sp)+,d2-d6/a2-a3/a5-a6
  1082.             rts
  1083. HaveEnt:    cldat   d2
  1084.             cldat   d3
  1085.             moveq   #13,d4
  1086.             move.w  gl_NumEntries(a2),d3
  1087.             sub.l   d0,d3
  1088.             cmp.l   #9,d3
  1089.             blt.s   LessTE
  1090.             moveq   #8,d3
  1091. LessTE:     move.l  d0,-(sp)
  1092.             move.l  gl_Freq(a2),a0
  1093.             move.l  fr_Directory(a0),-(sp)
  1094.             bsr     _GetEntryInfo
  1095.             addq.w  #8,sp
  1096.             move.l  d0,gl_FirstDisplayed(a2)
  1097.             move.l  d0,a3
  1098. PLoop:      bsr     setpen
  1099.             move.l  a3,a5
  1100.             cmp.w   #ENTRY_DEV,ei_Type(a5)
  1101.             bne.s   NotADev
  1102.             move.l  gl_RPort(a2),a0
  1103.             move.l  gl_Disk(a2),a1
  1104.             moveq   #5,d0
  1105.             move.l  d4,d1
  1106.             move.l  _IntuitionBase,a6
  1107.             libcall DrawImage
  1108.             bra.s   SetUPD
  1109. NotADev:    cmp.w   #ENTRY_DIR,ei_Type(a5)
  1110.             bne.s   IsAFile
  1111.             move.l  gl_RPort(a2),a0
  1112.             move.l  gl_Drawer(a2),a1
  1113.             moveq   #5,d0
  1114.             move.l  d4,d1
  1115.             move.l  _IntuitionBase,a6
  1116.             libcall DrawImage
  1117. SetUPD:     movem.l d2-d3,-(sp)
  1118.             move.l  gl_RPort(a2),a1
  1119.             move.l  #42,d0
  1120.             move.l  d4,d1
  1121.             move.l  #44,d2
  1122.             move.l  d4,d3
  1123.             addq.l  #8,d3
  1124.             move.l  _GfxBase,a6
  1125.             libcall RectFill
  1126.             movem.l (sp)+,d2-d3
  1127.             move.l  #23,d6
  1128.             move.l  #44,d5
  1129.             bra.s   DoName
  1130. IsAFile:    moveq   #5,d5
  1131.             move.l  #28,d6
  1132. DoName:     lea.l   ei_Name(a5),a0
  1133.             move.b  (a0,d6.l),-(sp)
  1134.             clr.b   (a0,d6.l)
  1135.             pea     RP_JAM2
  1136.             pea     1
  1137.             pea     2
  1138.             move.l  d4,-(sp)
  1139.             move.l  d5,-(sp)
  1140.             move.l  a0,-(sp)
  1141.             move.l  gl_RPort(a2),-(sp)
  1142.             bsr     _Print
  1143.             lea.l   28(sp),sp
  1144.             lea.l   ei_Name(a5),a0
  1145.             move.b  (sp)+,(a0,d6.l)
  1146.             bsr     StrLen
  1147.             mulu    #8,d0
  1148.             add.l   d0,d5
  1149.             cmp.l   #232,d5
  1150.             bge.s   NoClear
  1151.             bsr     setpen
  1152.             movem.l d2-d3,-(sp)
  1153.             move.l  gl_RPort(a2),a1
  1154.             move.l  d5,d0
  1155.             move.l  d4,d1
  1156.             move.l  #233,d2
  1157.             move.l  d4,d3
  1158.             addq.l  #8,d3
  1159.             libcall RectFill
  1160.             movem.l (sp)+,d2-d3
  1161. NoClear:    move.l  ei_Next(a3),a3
  1162.             add.l   #10,d4
  1163.             inc.l   d2
  1164.             cmp.l   d3,d2
  1165.             bne     PLoop
  1166.             cmp.l   #8,d2
  1167.             bge     EndPD
  1168.             bsr     setpen
  1169.             move.l  gl_RPort(a2),a1
  1170.             moveq   #4,d0
  1171.             move.l  d4,d1
  1172.             move.l  #233,d2
  1173.             move.l  #91,d3
  1174.             libcall RectFill
  1175.             bra     EndPD
  1176.  
  1177. *
  1178. * increase prop position by "x"
  1179. *
  1180. _AddProp:   movem.l d2-d5/a2/a6,-(sp)
  1181.             move.l  28(sp),a2
  1182.             move.l  32(sp),d3
  1183.             cmp.w   #8,gl_NumEntries(a2)
  1184.             bge.s   AddIt
  1185. RF:         cldat   d0
  1186. EndAP:      movem.l (sp)+,d2-d5/a2/a6
  1187.             rts
  1188. AddIt:      cldat   d2
  1189.             cldat   d4
  1190.             move.l  gl_PInfo(a2),a0
  1191.             move.w  pi_VertPot(a0),d2
  1192.             move.w  pi_VertBody(a0),d4
  1193.             cmp.l   #$ffff,d2
  1194.             beq.s   RF
  1195.             move.l  d4,d0
  1196.             mulu    d3,d0
  1197.             add.l   d0,d2
  1198.             cmp.l   #$ffff,d2
  1199.             bmi.s   NoMax
  1200.             move.l  #$ffff,d2
  1201. NoMax:      move.l  _IntuitionBase,a6
  1202.             move.l  gl_Prop(a2),a0
  1203.             move.l  gl_Window(a2),a1
  1204.             cladr   a2
  1205.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1206.             cldat   d1
  1207.             move.l  #$ffff,d3
  1208.             moveq   #1,d5
  1209.             libcall NewModifyProp
  1210.             moveq   #1,d0
  1211.             bra.s   EndAP
  1212.  
  1213. *
  1214. * decrease the prop position by "x"
  1215. *
  1216. _SubProp:   movem.l d2-d5/a2/a6,-(sp)
  1217.             move.l  28(sp),a2
  1218.             move.l  32(sp),d3
  1219.             cmp.w   #8,gl_NumEntries(a2)
  1220.             bge.s   SubIt
  1221. RFA:        cldat   d0
  1222. EndSP:      movem.l (sp)+,d2-d5/a2/a6
  1223.             rts
  1224. SubIt:      cldat   d2
  1225.             cldat   d4
  1226.             move.l  gl_PInfo(a2),a0
  1227.             move.w  pi_VertPot(a0),d2
  1228.             move.w  pi_VertBody(a0),d4
  1229.             tst.l   d2
  1230.             beq.s   RFA
  1231.             move.l  d4,d0
  1232.             mulu    d3,d0
  1233.             sub.l   d0,d2
  1234.             tst.l   d2
  1235.             bpl.s   NoMin
  1236.             cldat   d2
  1237. NoMin:      move.l  _IntuitionBase,a6
  1238.             move.l  gl_Prop(a2),a0
  1239.             move.l  gl_Window(a2),a1
  1240.             cladr   a2
  1241.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1242.             cldat   d1
  1243.             move.l  #$ffff,d3
  1244.             moveq   #1,d5
  1245.             libcall NewModifyProp
  1246.             moveq   #1,d0
  1247.             bra.s   EndSP
  1248.  
  1249. *
  1250. * a gadget in the fileselection block was selected. look what the type of
  1251. * entry the gadget was and take appropiate action.
  1252. *
  1253. _DoFSel:    movem.l d2/a2-a3/a5-a6,-(sp)
  1254.             move.l  24(sp),a2
  1255.             cldat   d2
  1256.             move.w  gl_Id(a2),d2
  1257.             subq.w  #8,d2
  1258.             cmp.w   gl_NumEntries(a2),d2
  1259.             bcs.s   NumOK
  1260. EndDF:      movem.l (sp)+,d2/a2-a3/a5-a6
  1261.             rts
  1262. NumOK:      move.l  gl_FirstDisplayed(a2),a3
  1263.             bra.s   Test
  1264. Loop:       move.l  ei_Next(a3),a3
  1265. Test:       dbra    d2,Loop
  1266.             move.l  _IntuitionBase,a6
  1267.             move.l  a3,a5
  1268.             cmp.w   #ENTRY_FILE,ei_Type(a5)
  1269.             bne.s   NotAFile
  1270.             move.l  gl_FileBuf(a2),a0
  1271.             lea.l   ei_Name(a5),a1
  1272.             bsr     StrCpy
  1273.             move.l  gl_FileG(a2),a0
  1274.             move.l  gl_Window(a2),a1
  1275.             cladr   a2
  1276.             moveq   #1,d0
  1277.             libcall RefreshGList
  1278.             bra.s   EndDF
  1279. NotAFile:   cmp.w   #ENTRY_DIR,ei_Type(a5)
  1280.             bne.s   MustBeADev
  1281.             move.l  gl_DrawerBuf(a2),a0
  1282.             bsr     StrLen
  1283.             dec.w   a0
  1284.             lea.l   ei_Name(a5),a1
  1285.             bsr     StrCpy
  1286.             move.b  #'/',(a0)+
  1287.             clr.b   (a0)
  1288.             bra.s   Refr
  1289. MustBeADev: move.l  gl_DrawerBuf(a2),a0
  1290.             lea.l   ei_Name(a5),a1
  1291.             bsr     StrCpy
  1292. Refr:       move.l  a2,-(sp)
  1293.             move.l  gl_DirG(a2),a0
  1294.             move.l  gl_Window(a2),a1
  1295.             cladr   a2
  1296.             moveq   #1,d0
  1297.             libcall RefreshGList
  1298.             move.l  (sp),a2
  1299.             lea.l   gl_Pattern(a2),a0
  1300.             clr.b   (a0)
  1301.             bsr     _OpenUpDir
  1302.             addq.w  #4,sp
  1303.             bra     EndDF
  1304. *
  1305. * append a '/' to the pathname if neacecary
  1306. *
  1307. _UpDatePath:
  1308.             move.l  a2,-(sp)
  1309.             move.l  8(sp),a2
  1310.             move.l  gl_DrawerBuf(a2),a0
  1311.             bsr     StrLen
  1312.             tst.l   d0
  1313.             beq.s   NoUDP
  1314.             subq.w  #2,a0
  1315.             cmp.b   #':',(a0)
  1316.             beq.s   NoUDP
  1317.             cmp.b   #'/',(a0)
  1318.             beq.s   NoUDP
  1319.             inc.w   a0
  1320.             move.b  #'/',(a0)+
  1321.             clr.b   (a0)
  1322. NoUDP:      move.l  (sp)+,a2
  1323.             rts
  1324.  
  1325. *
  1326. * read the parent directory of the current directory
  1327. *
  1328. _Parent:    movem.l a2/a6,-(sp)
  1329.             move.l  12(sp),a2
  1330.             move.l  gl_DrawerBuf(a2),a0
  1331.             bsr     StrLen
  1332.             tst.l   d0
  1333.             bne.s   HavePath
  1334. FALSE:      cldat   d0
  1335. EndP:       movem.l (sp)+,a2/a6
  1336.             rts
  1337. HavePath:   subq.w  #2,a0
  1338.             cmp.b   #':',(a0)
  1339.             beq.s   FALSE
  1340.             dec.w   a0
  1341. Search:     move.b   -(a0),d0
  1342.             cmp.b   #':',d0
  1343.             beq.s   GotPar
  1344.             cmp.b   #'/',d0
  1345.             bne.s   Search
  1346. GotPar:     inc.w   a0
  1347.             clr.b   (a0)
  1348.             move.l  gl_DirG(a2),a0
  1349.             move.l  gl_Window(a2),a1
  1350.             cladr   a2
  1351.             moveq   #1,d0
  1352.             move.l  _IntuitionBase,a6
  1353.             libcall RefreshGList
  1354.             moveq   #1,d0
  1355.             bra.s   EndP
  1356.  
  1357. *
  1358. * lock the caller window its IDCMP with a small requester
  1359. *
  1360. _LockCaller:
  1361.             movem.l a2-a3/a6,-(sp)
  1362.             move.l  16(sp),a2
  1363.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  1364.             move.l  #rq_SIZEOF,d0
  1365.             lea.l   gl_Misc(a2),a0
  1366.             bsr     AllocItem
  1367.             move.l  d0,a3
  1368.             bne.s   GotReq
  1369. EndLC:      movem.l (sp)+,a2-a3/a6
  1370.             rts
  1371. GotReq:     move.l  _IntuitionBase,a6
  1372.             move.l  a3,a0
  1373.             libcall InitRequester
  1374.             move.w  #1,rq_Width(a3)
  1375.             move.w  #1,rq_Height(a3)
  1376.             move.l  _GfxBase,a6
  1377.             move.l  gl_Freq(a2),a1
  1378.             move.l  fr_Caller(a1),a1
  1379.             move.l  wd_RPort(a1),a1
  1380.             cldat   d0
  1381.             cldat   d1
  1382.             libcall ReadPixel
  1383.             move.b  d0,rq_BackFill(a3)
  1384.             move.l  _IntuitionBase,a6
  1385.             move.l  a3,a0
  1386.             move.l  gl_Freq(a2),a1
  1387.             move.l  fr_Caller(a1),a1
  1388.             libcall Request
  1389.             tst.l   d0
  1390.             beq.s   EndLC
  1391.             move.l  a3,gl_WindowLock(a2)
  1392.             bra.s   EndLC
  1393.  
  1394. *
  1395. * remove the requester
  1396. *
  1397. _UnLockCaller:
  1398.             movem.l a2/a6,-(sp)
  1399.             move.l  12(sp),a2
  1400.             tst.l   gl_WindowLock(a2)
  1401.             bne.s   CanCL
  1402. EndULC:     movem.l (sp)+,a2/a6
  1403.             rts
  1404. CanCL:      move.l  _IntuitionBase,a6
  1405.             move.l  gl_WindowLock(a2),a0
  1406.             move.l  gl_Freq(a2),a1
  1407.             move.l  fr_Caller(a1),a1
  1408.             libcall EndRequest
  1409.             bra.s   EndULC
  1410.  
  1411. MODE_READWRITE      EQU     1004        ;  'libraries/dos.i' ?!?!?!?!
  1412. *
  1413. * end the filerequester and open the selected file if requested
  1414. *
  1415. _TheEnd:    link    a5,#-256
  1416.             movem.l d2-d4/a2-a3/a6,-(sp)
  1417.             move.l  8(a5),a2
  1418.             move.l  12(a5),d2
  1419.             move.l  gl_Freq(a2),a3
  1420.             cldat   d3
  1421.             move.w  fr_Flags(a3),d3
  1422.             moveq   #1,d4
  1423.             lea.l   -256(a5),a0
  1424.             move.l  gl_DrawerBuf(a2),a1
  1425.             bsr     StrCpy
  1426.             move.l  gl_FileBuf(a2),a1
  1427.             bsr     StrCpy
  1428.             move.l  d3,d0
  1429.             btst    #3,d0
  1430.             beq.s   NoCC
  1431.             move.l  a2,-(sp)
  1432.             bsr     _DoColors
  1433.             addq.w  #4,sp
  1434. NoCC:       move.l  fr_Directory(a3),a0
  1435.             bsr     CloseDir
  1436.             btst    #0,d3
  1437.             beq.s   DoPR
  1438.             move.l  fr_Directory(a3),a0
  1439.             bsr     FreeDir
  1440. DoPR:       tst.l   gl_IsNext(a2)           ; if the requester wasn't ready
  1441.             beq.s   DoOpen                  ; reading the directory the dir
  1442.             move.l  fr_Directory(a3),a0     ; is freed wheter FR_NoPreserve
  1443.             bsr     FreeDir                 ; is set or not.
  1444. DoOpen:     move.l  _DOSBase,a6
  1445.             cmp.l   #FREQ_CANCELED,d2
  1446.             beq.s   OpenDone
  1447.             btst    #4,d3
  1448.             beq.s   NoOld
  1449.             btst    #5,d3
  1450.             bne.s   DoVoid
  1451.             btst    #6,d3
  1452.             bne.s   DoVoid
  1453.             move.l  #MODE_OLDFILE,d2
  1454.             bra.s   OpenIt
  1455. NoOld:      btst    #5,d3
  1456.             beq.s   NoNew
  1457.             btst    #4,d3
  1458.             bne.s   DoVoid
  1459.             btst    #6,d3
  1460.             bne.s   DoVoid
  1461.             move.l  #MODE_NEWFILE,d2
  1462.             bra.s   OpenIt
  1463. NoNew:      btst    #6,d3
  1464.             beq.s   DoVoid
  1465.             btst    #5,d3
  1466.             bne.s   DoVoid
  1467.             btst    #4,d3
  1468.             bne.s   DoVoid
  1469.             move.l  #MODE_READWRITE,d2
  1470. OpenIt:     lea.l   -256(a5),a0
  1471.             move.l  a0,d1
  1472.             libcall Open
  1473.             move.l  d0,fr_Handle(a3)
  1474.             tst.l   d0
  1475.             bne.s   OpenDone
  1476.             cldat   d4
  1477.             bra.s   OpenDone
  1478. DoVoid:     clr.l   fr_Handle(a3)
  1479. OpenDone:   move.l  _GfxBase,a6
  1480.             move.l  gl_Font(a2),a1
  1481.             libcall CloseFont
  1482.             move.l  gl_Proc(a2),a0
  1483.             move.l  gl_PRWindow(a2),pr_WindowPtr(a0)
  1484.             move.l  gl_Window(a2),a0
  1485.             move.l  _IntuitionBase,a6
  1486.             libcall CloseWindow
  1487.             tst.l   fr_Caller(a3)
  1488.             beq.s   NoCL
  1489.             move.l  a2,-(sp)
  1490.             bsr     _UnLockCaller
  1491.             addq.w  #4,sp
  1492. NoCL:       lea.l   gl_Misc(a2),a0
  1493.             bsr     FreeMemoryChain
  1494.             move.l  gl_TimeDelay(a2),a0
  1495.             bsr     DeleteTimeDelay
  1496.             move.l  d4,d0
  1497.             movem.l (sp)+,d2-d4/a2-a3/a6
  1498.             unlk    a5
  1499.             rts
  1500.  
  1501.  
  1502. *
  1503. * the main routine
  1504. *
  1505.             xdef    FileRequest
  1506.  
  1507. FileRequest:
  1508.             movem.l d2-d5/a2-a3/a6,-(sp)
  1509.             move.l  a0,a3
  1510.  
  1511.             cldat   d2
  1512.             cldat   d3
  1513.  
  1514.             move.l  (_SysBase).w,a6
  1515.             move.l  #gl_SIZEOF,d0
  1516.             move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  1517.             libcall AllocMem
  1518.             move.l  d0,a2
  1519.             bne.s   GotGlob
  1520.  
  1521.             moveq   #FREQ_CANT_OPEN,d0
  1522. EndFR:      movem.l (sp)+,d2-d5/a2-a3/a6
  1523.             rts
  1524. GotGlob:
  1525.             move.l  a3,gl_Freq(a2)
  1526.             move.l  fr_FileName(a3),gl_FileBuf(a2)
  1527.             move.l  fr_DirName(a3),gl_DrawerBuf(a2)
  1528.  
  1529.             lea.l   gl_Misc(a2),a0
  1530.             move.l  #1024,d0
  1531.             bsr     InitMemoryChain
  1532.  
  1533.             tst.l   fr_Caller(a3)
  1534.             beq.s   NoCaller
  1535.             move.l  a2,-(sp)
  1536.             bsr     _LockCaller
  1537.             addq.w  #4,sp
  1538. NoCaller:
  1539.             clr.w   gl_IsSorted(a2)
  1540.  
  1541.             move.l  a2,-(sp)
  1542.             bsr     _GetFSWindow
  1543.             addq.w  #4,sp
  1544.             tst.l   d0
  1545.             beq     FreqFailed
  1546.  
  1547.             move.l  gl_Window(a2),a0
  1548.             move.l  wd_UserPort(a0),a0
  1549.             cldat   d0
  1550.             move.l  #100000,d1
  1551.             bsr     CreateTimeDelay
  1552.             move.l  d0,gl_TimeDelay(a2)
  1553.             beq     FreqFailed
  1554.  
  1555.             lea.l   gl_Pattern(a2),a1
  1556.             move.l  fr_DirName(a3),a0
  1557.             bsr     Isolate
  1558.  
  1559.             move.l  a2,-(sp)
  1560.             bsr     _UpDatePath
  1561.             addq.w  #4,sp
  1562.  
  1563.             move.l  fr_Directory(a3),a0
  1564.             tst.l   dr_NumEntries(a0)
  1565.             beq.s   NewDir
  1566.             move.l  dr_First(a0),gl_FirstDisplayed(a2)
  1567.             move.w  dr_NumEntries+2(a0),gl_NumEntries(a2)
  1568.             move.l  a2,-(sp)
  1569.             bsr     _SetProp
  1570.             addq.w  #4,sp
  1571.             move.l  #0,gl_IsNext(a2)
  1572.             bra.s   PrintIt
  1573. NewDir:
  1574.             move.l  a2,-(sp)
  1575.             bsr     _OpenUpDir
  1576.             addq.w  #4,sp
  1577. PrintIt:
  1578.             pea     0
  1579.             move.l  a2,-(sp)
  1580.             bsr     _PrintDir
  1581.             addq.w  #8,sp
  1582.  
  1583. FOREVER:
  1584.             tst.l   gl_IsNext(a2)
  1585.             beq.s   Wait
  1586.             move.l  a2,-(sp)
  1587.             bsr     _GetNext
  1588.             addq.w  #4,sp
  1589.             bra.s   Eval
  1590. Wait:
  1591.             move.l  (_SysBase).w,a6
  1592.             move.l  gl_Window(a2),a0
  1593.             move.l  wd_UserPort(a0),a0
  1594.             libcall WaitPort
  1595.  
  1596.             move.l  a2,-(sp)
  1597.             bsr     _DoMsg
  1598.             addq.w  #4,sp
  1599.             tst.w   gl_IsSorted(a2)
  1600.             bne.s   Evals
  1601.             cmp.w   #7,gl_Id(a2)
  1602.             bhi.s   Evals
  1603.             cldat   d0
  1604.             move.w  fr_Flags(a3),d0
  1605.             btst.l  #2,d0
  1606.             bne.s   Evals
  1607.             move.l  fr_Directory(a3),-(sp)
  1608.             bsr     _SortNames
  1609.             addq.w  #4,sp
  1610.             move.l  a2,-(sp)
  1611.             bsr     _PPos
  1612.             addq.w  #4,sp
  1613.             move.l  d0,-(sp)
  1614.             move.l  a2,-(sp)
  1615.             bsr     _PrintDir
  1616.             addq.w  #8,sp
  1617.             move.w  #1,gl_IsSorted(a2)
  1618.             bra.s   Evals
  1619. Eval:
  1620.             move.l  a2,-(sp)
  1621.             bsr     _DoMsg
  1622.             addq.w  #4,sp
  1623.             tst.l   d0
  1624.             beq     FOREVER
  1625. Evals:      cmp.l   #CLOSEWINDOW,gl_Class(a2)
  1626.             bne.s   NoCLW
  1627.             bra     CloseW
  1628. NoCLW:      cmp.l   #MOUSEBUTTONS,gl_Class(a2)
  1629.             bne.s   NotMB
  1630.             cmp.w   #MENUDOWN,gl_Code(a2)
  1631.             bne.s   Eval
  1632.             movem.l d2-d5/a2,-(sp)
  1633.             cldat   d4
  1634.             move.l  gl_PInfo(a2),a0
  1635.             move.w  pi_VertBody(a0),d4
  1636.             move.l  _IntuitionBase,a6
  1637.             move.l  gl_Prop(a2),a0
  1638.             move.l  gl_Window(a2),a1
  1639.             cladr   a2
  1640.             move.l  #AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT,d0
  1641.             cldat   d1
  1642.             cldat   d2
  1643.             move.l  #$ffff,d3
  1644.             moveq   #1,d5
  1645.             libcall NewModifyProp
  1646.             movem.l (sp)+,d2-d5/a2
  1647.             cldat   d2
  1648.             pea     0
  1649.             move.l  a2,-(sp)
  1650.             bsr     _PrintDir
  1651.             addq.w  #8,sp
  1652.             bra.s   Eval
  1653. NotMB:
  1654.             cmp.l   #MOUSEMOVE,gl_Class(a2)
  1655.             bne.s   NotMM
  1656.             bsr     PropB
  1657.             bra     Eval
  1658. NotMM:
  1659.             cmp.l   #GADGETDOWN,gl_Class(a2)
  1660.             bne.s   NoGD
  1661.             cmp.w   #5,gl_Id(a2)
  1662.             bne.s   NotProp
  1663.             bsr     PropB
  1664.             bra     Eval
  1665. NotProp:    cmp.w   #6,gl_Id(a2)
  1666.             bne.s   NotDown
  1667.             bsr     Down
  1668.             bra     Eval
  1669. NotDown:    cmp.w   #7,gl_Id(a2)
  1670.             bne     Eval
  1671.             bsr     Up
  1672.             bra     Eval
  1673. NoGD:
  1674.             cmp.l   #GADGETUP,gl_Class(a2)
  1675.             bne.s   NotGU
  1676.             cmp.w   #8,gl_Id(a2)
  1677.             bmi.s   NoFS
  1678.             move.l  a2,-(sp)
  1679.             bsr     _DoFSel
  1680.             addq.w  #4,sp
  1681.             bra     Eval
  1682. NoFS:       tst.w   gl_Id(a2)
  1683.             bne.s   NoCNC
  1684.             bra     CloseW
  1685. NoCNC:      cmp.w   #1,gl_Id(a2)
  1686.             bne.s   NoPar
  1687.             bsr     Par
  1688.             bra     Eval
  1689. NoPar:      cmp.w   #2,gl_Id(a2)
  1690.             beq.s   DoOK
  1691.             cmp.w   #3,gl_Id(a2)
  1692.             bne.s   NoOK
  1693. DoOK:       bra     TryOK
  1694. NoOK:       cmp.w   #4,gl_Id(a2)
  1695.             bne     Eval
  1696.             bsr     NewPath
  1697.             bra     Eval
  1698. NotGU:      cmp.l   #RAWKEY,gl_Class(a2)
  1699.             bne     Eval
  1700.             tst.l   gl_IsNext(a2)
  1701.             bne     Eval
  1702.             move.w  gl_Code(a2),d0
  1703.             andi.w  #IECODE_UP_PREFIX,d0
  1704.             cmp.w   #IECODE_UP_PREFIX,d0
  1705.             beq     Eval
  1706.             cmp.w   #IEQUALIFIER_RELATIVEMOUSE,gl_Qualifier(a2)
  1707.             beq     Good
  1708.             cmp.w   #IEQUALIFIER_RELATIVEMOUSE+IEQUALIFIER_CAPSLOCK,gl_Qualifier(a2)
  1709.             bne     Eval
  1710. Good:       cmp.w   #$5F,gl_Code(a2)
  1711.             bne     Eval
  1712.             move.l  a2,-(sp)
  1713.             bsr     _OpenUpDir
  1714.             addq.w  #4,sp
  1715.             bra     Eval
  1716. FreqFailed: tst.l   gl_WindowLock(a2)
  1717.             beq.s   NoWDL
  1718.             move.l  a2,-(sp)
  1719.             bsr     _UnLockCaller
  1720.             addq.w  #4,sp
  1721. NoWDL:      lea.l   gl_Misc(a2),a0
  1722.             bsr     FreeMemoryChain
  1723.             move.l  #gl_SIZEOF,d0
  1724.             move.l  a2,a1
  1725.             move.l  (_SysBase).w,a6
  1726.             libcall FreeMem
  1727.             moveq   #FREQ_CANT_OPEN,d0
  1728.             bra     EndFR
  1729.  
  1730. CloseW:     pea     FREQ_CANCELED
  1731.             move.l  a2,-(sp)
  1732.             bsr     _TheEnd
  1733.             addq.w  #8,sp
  1734.             move.l  #gl_SIZEOF,d0
  1735.             move.l  a2,a1
  1736.             move.l  (_SysBase).w,a6
  1737.             libcall FreeMem
  1738.             moveq   #FREQ_CANCELED,d0
  1739.             bra     EndFR
  1740.  
  1741. PropB:      move.l  gl_PInfo(a2),a0
  1742.             move.w  pi_Flags(a0),d0
  1743.             btst.l  #8,d0
  1744.             bne.s   PropM
  1745.             move.l  a2,-(sp)
  1746.             bsr     _PPos
  1747.             addq.w  #4,sp
  1748.             pea     6
  1749.             move.l  a2,-(sp)
  1750.             cmp.l   d0,d2
  1751.             beq.s   MsgL
  1752.             bhi.s   SubP
  1753.             bsr     _AddProp
  1754.             bra.s   SetU
  1755. SubP:       bsr     _SubProp
  1756. SetU:       addq.w  #8,sp
  1757.             move.l  a2,-(sp)
  1758.             bsr     _PPos
  1759.             addq.w  #4,sp
  1760.             move.l  d0,d2
  1761.             move.l  d0,-(sp)
  1762.             move.l  a2,-(sp)
  1763.             bsr     _PrintDir
  1764.             addq.w  #8,sp
  1765. MsgL:       move.l  a2,-(sp)
  1766.             bsr     _DoMsg
  1767.             addq.w  #4,sp
  1768.             tst.l   d0
  1769.             bne.s   MsgL
  1770.             rts
  1771.  
  1772. PropM:      move.l  a2,-(sp)
  1773.             bsr     _PPos
  1774.             addq.w  #4,sp
  1775.             move.l  d0,d3
  1776.             cmp.l   d2,d3
  1777.             beq.s   MsgL
  1778.             move.l  d3,-(sp)
  1779.             move.l  a2,-(sp)
  1780.             bsr     _PrintDir
  1781.             addq.w  #8,sp
  1782.             move.l  d3,d2
  1783. NoNxt:      bra.s   MsgL
  1784.  
  1785. Down:       cldat   d0
  1786.             move.l  gl_IAddress(a2),a0
  1787.             move.w  gg_Flags(a0),d0
  1788.             andi.w  #SELECTED,d0
  1789.             beq.s   NotSL
  1790.             pea     1
  1791.             move.l  a2,-(sp)
  1792.             bsr     _AddProp
  1793.             addq.w  #8,sp
  1794.             move.l  a2,-(sp)
  1795.             bsr     _PPos
  1796.             addq.w  #4,sp
  1797.             move.l  d0,d2
  1798.             move.l  d2,-(sp)
  1799.             move.l  a2,-(sp)
  1800.             bsr     _PrintDir
  1801.             addq.w  #8,sp
  1802.             tst.l   gl_IsNext(a2)
  1803.             bne.s   NoDel
  1804. NotSL:      move.l  gl_TimeDelay(a2),a0
  1805.             bsr     DoTimeDelay
  1806. NoDel:      move.l  a2,-(sp)
  1807.             bsr     _DoMsg
  1808.             addq.w  #4,sp
  1809.             tst.l   gl_IsNext(a2)
  1810.             beq.s   NoNxt1
  1811.             move.l  a2,-(sp)
  1812.             bsr     _GetNext
  1813.             addq.w  #4,sp
  1814. NoNxt1:     cmp.l   #GADGETUP,gl_Class(a2)
  1815.             beq.s   NoMoreD
  1816.             cmp.w   #SELECTUP,gl_Code(a2)
  1817.             bne.s   Down
  1818. NoMoreD:    move.l  a2,-(sp)
  1819.             bsr     _DoMsg
  1820.             addq.w  #4,sp
  1821.             tst.l   d0
  1822.             bne.s   NoMoreD
  1823.             rts
  1824.  
  1825. Up:         cldat   d0
  1826.             move.l  gl_IAddress(a2),a0
  1827.             move.w  gg_Flags(a0),d0
  1828.             andi.w  #SELECTED,d0
  1829.             beq.s   NotSL1
  1830.             pea     1
  1831.             move.l  a2,-(sp)
  1832.             bsr     _SubProp
  1833.             addq.w  #8,sp
  1834.             move.l  a2,-(sp)
  1835.             bsr     _PPos
  1836.             addq.w  #4,sp
  1837.             move.l  d0,d2
  1838.             move.l  d2,-(sp)
  1839.             move.l  a2,-(sp)
  1840.             bsr     _PrintDir
  1841.             addq.w  #8,sp
  1842.             tst.l   gl_IsNext(a2)
  1843.             bne.s   NoDel1
  1844. NotSL1:     move.l  gl_TimeDelay(a2),a0
  1845.             bsr     DoTimeDelay
  1846. NoDel1:     move.l  a2,-(sp)
  1847.             bsr     _DoMsg
  1848.             addq.w  #4,sp
  1849.             tst.l   gl_IsNext(a2)
  1850.             beq.s   NoNxt2
  1851.             move.l  a2,-(sp)
  1852.             bsr     _GetNext
  1853.             addq.w  #4,sp
  1854. NoNxt2:     cmp.l   #GADGETUP,gl_Class(a2)
  1855.             beq.s   NoMoreU
  1856.             cmp.w   #SELECTUP,gl_Code(a2)
  1857.             bne.s   Up
  1858. NoMoreU:    move.l  a2,-(sp)
  1859.             bsr     _DoMsg
  1860.             addq.w  #4,sp
  1861.             tst.l   d0
  1862.             bne.s   NoMoreU
  1863.             rts
  1864.  
  1865. Par:        move.l  a2,-(sp)
  1866.             bsr     _Parent
  1867.             addq.w  #4,sp
  1868.             tst.l   d0
  1869.             beq.s   NoParent
  1870.             lea.l   gl_Pattern(a2),a0
  1871.             clr.b   (a0)
  1872.             move.l  a2,-(sp)
  1873.             bsr     _OpenUpDir
  1874.             addq.w  #4,sp
  1875.             move.l  a2,-(sp)
  1876.             bsr     _PPos
  1877.             addq.w  #4,sp
  1878.             move.l  d0,d2
  1879. NoParent:   rts
  1880.  
  1881. TryOK:      move.l  gl_FileBuf(a2),a0
  1882.             bsr     StrLen
  1883.             tst.l   d0
  1884.             beq     Eval
  1885.             pea     FREQ_OK
  1886.             move.l  a2,-(sp)
  1887.             bsr     _TheEnd
  1888.             addq.w  #8,sp
  1889.             move.l  d0,d5
  1890.             move.l  (_SysBase).w,a6
  1891.             move.l  a2,a1
  1892.             move.l  #gl_SIZEOF,d0
  1893.             libcall FreeMem
  1894.             tst.l   d5
  1895.             beq.s   RetF
  1896.             moveq   #FREQ_OK,d0
  1897.             bra     EndFR
  1898. RetF:       moveq   #FREQ_FILE_ERROR,d0
  1899.             bra     EndFR
  1900.  
  1901. NewPath:    lea.l   gl_Pattern(a2),a1
  1902.             move.l  gl_DrawerBuf(a2),a0
  1903.             bsr     Isolate
  1904.             move.l  a2,-(sp)
  1905.             bsr     _UpDatePath
  1906.             addq.w  #4,sp
  1907.             move.l  a2,-(sp)
  1908.             move.l  _IntuitionBase,a6
  1909.             move.l  gl_DirG(a2),a0
  1910.             move.l  gl_Window(a2),a1
  1911.             cladr   a2
  1912.             moveq   #1,d0
  1913.             libcall RefreshGList
  1914.             move.l  (sp),a2
  1915.             bsr     _OpenUpDir
  1916.             bsr     _PPos
  1917.             addq.w  #4,sp
  1918.             move.l  d0,d2
  1919.             rts
  1920.  
  1921. *
  1922. * Datas for the gadgets, window, texts e.c.t. This data get's read only.
  1923. *
  1924.         even
  1925. *
  1926. * The PropInfo structure.
  1927. *
  1928. PINFO:  dc.w    AUTOKNOB+FREEVERT+PROPBORDERLESS+KNOBHIT
  1929.         dc.w    $0000,$0000,$ffff,$ffff,0,0,0,0,0,0
  1930.  
  1931. *
  1932. * The Image structures.
  1933. *
  1934. FSI:    dc.w    3,0,14,8,2
  1935.         dc.l    0
  1936.         dc.b    1,0
  1937.         dc.l    0
  1938.  
  1939.         dc.w    3,0,14,8,2
  1940.         dc.l    0
  1941.         dc.b    1,0
  1942.         dc.l    0
  1943.  
  1944.         dc.w    0,0,37,8,2
  1945.         dc.l    0
  1946.         dc.b    3,0
  1947.         dc.l    0
  1948.  
  1949.         dc.w    0,0,37,8,2
  1950.         dc.l    0
  1951.         dc.b    1,0
  1952.         dc.l    0
  1953. *
  1954. * The image data.
  1955. *
  1956. FSD:    dc.w    $FFFC,$8004,$C00C,$E01C,$F03C,$F87C,$FCFC,$FFFC
  1957.         dc.w    $FFFC,$FCFC,$F87C,$F03C,$E01C,$C00C,$8004,$FFFC
  1958.         dc.w    $FFFF,$FFFF,$F800,$8000,$0000,$0800,$BFFF,$FFFF
  1959.         dc.w    $E800,$BFE3,$FC7F,$E800,$BFF0,$003F,$E800,$BFFF
  1960.         dc.w    $FFFF,$E800,$8000,$0000,$0800,$FFFF,$FFFF,$F800
  1961.         dc.w    $FFF8,$01FF,$F800,$FFF8,$017F,$F800,$FFF8,$01FF
  1962.         dc.w    $F800,$FFF8,$01FF,$F800,$FFFF,$FFFF,$F800,$FFF8
  1963.         dc.w    $01FF,$F800,$FFFB,$01FF,$F800,$FFF8,$01FF,$F800
  1964.         dc.w    $003F,$FFC0,$0000,$003F,$FFC0,$0000,$003F,$FFC0
  1965.         dc.w    $0000,$003F,$FFC0,$0000,$003F,$FFC0,$0000,$0038
  1966.         dc.w    $01C0,$0000,$0038,$01C0,$0000,$0018,$01C0,$0000
  1967. *
  1968. * The FileRequester Gadgets.
  1969. *
  1970. FSG:    dc.l    0
  1971.         dc.w    180,122,68,11
  1972.         dc.w    GADGHCOMP
  1973.         dc.w    RELVERIFY
  1974.         dc.w    BOOLGADGET
  1975.         dc.l    0,0,0,0,0
  1976.         dc.w    0
  1977.         dc.l    0
  1978.  
  1979.         dc.l    0
  1980.         dc.w    96,122,68,11
  1981.         dc.w    GADGHCOMP
  1982.         dc.w    RELVERIFY
  1983.         dc.w    BOOLGADGET
  1984.         dc.l    0,0,0,0,0
  1985.         dc.w    1
  1986.         dc.l    0
  1987.  
  1988.         dc.l    0
  1989.         dc.w    12,122,68,11
  1990.         dc.w    GADGHCOMP
  1991.         dc.w    RELVERIFY
  1992.         dc.w    BOOLGADGET
  1993.         dc.l    0,0,0,0,0
  1994.         dc.w    2
  1995.         dc.l    0
  1996.  
  1997.         dc.l    0
  1998.         dc.w    64,109,184,8
  1999.         dc.w    GADGHCOMP
  2000.         dc.w    RELVERIFY
  2001.         dc.w    STRGADGET
  2002.         dc.l    0,0,0,0,0
  2003.         dc.w    3
  2004.         dc.l    0
  2005.  
  2006.         dc.l    0
  2007.         dc.w    64,97,184,8
  2008.         dc.w    GADGHCOMP
  2009.         dc.w    RELVERIFY
  2010.         dc.w    STRGADGET
  2011.         dc.l    0,0,0,0,0
  2012.         dc.w    4
  2013.         dc.l    0
  2014.  
  2015.         dc.l    0
  2016.         dc.w    239,23,14,58
  2017.         dc.w    GADGHCOMP
  2018.         dc.w    RELVERIFY+GADGIMMEDIATE+FOLLOWMOUSE
  2019.         dc.w    PROPGADGET
  2020.         dc.l    0,0,0,0,0
  2021.         dc.w    5
  2022.         dc.l    0
  2023.  
  2024.         dc.l    0
  2025.         dc.w    236,84,20,8
  2026.         dc.w    GADGHCOMP+GADGIMAGE
  2027.         dc.w    RELVERIFY+GADGIMMEDIATE
  2028.         dc.w    BOOLGADGET
  2029.         dc.l    0,0,0,0,0
  2030.         dc.w    6
  2031.         dc.l    0
  2032.  
  2033.         dc.l    0
  2034.         dc.w    236,12,20,8
  2035.         dc.w    GADGHCOMP+GADGIMAGE
  2036.         dc.w    RELVERIFY+GADGIMMEDIATE
  2037.         dc.w    BOOLGADGET
  2038.         dc.l    0,0,0,0,0
  2039.         dc.w    7
  2040.         dc.l    0
  2041. *
  2042. * The Gadget structure for the File-Selection block.
  2043. *
  2044. FGAD:   dc.l    0
  2045.         dc.w    4,12,230,10
  2046.         dc.w    GADGHCOMP
  2047.         dc.w    RELVERIFY
  2048.         dc.w    BOOLGADGET
  2049.         dc.l    0,0,0,0,0
  2050.         dc.w    0
  2051.         dc.l    0
  2052. *
  2053. * The FileRequester NewWindow structure.
  2054. *
  2055. fsnw:   dc.w    40,15,260,140
  2056.         dc.b    2,1
  2057.         dc.l    GADGETDOWN+GADGETUP+CLOSEWINDOW+MOUSEBUTTONS+MOUSEMOVE+RAWKEY
  2058.         dc.l    WINDOWDRAG+WINDOWCLOSE+ACTIVATE+RMBTRAP+NOCAREREFRESH
  2059.         dc.l    0,0,0,0,0
  2060.         dc.w    0,0,0,0,WBENCHSCREEN
  2061. *
  2062. * Various texts used.
  2063. *
  2064. fnam:   dc.b    'topaz.font',0
  2065. oktext: dc.b    'OK',0
  2066. cancel: dc.b    'CANCEL',0
  2067. parent: dc.b    'Parent',0
  2068. file:   dc.b    'File',0
  2069. drawer: dc.b    'Drawer',0
  2070. nomem:  dc.b    'Out of memory !',0
  2071. open:   dc.b    'Can',96,'t open this dir !',0
  2072. ninfo:  dc.b    '*.info',0
  2073.  
  2074.         even
  2075. *
  2076. * TextAttr structure (topaz 8)
  2077. *
  2078. TOPAZ_80:
  2079.         dc.l    fnam
  2080.         dc.w    TOPAZ_EIGHTY
  2081.         dc.b    FS_NORMAL,FPF_ROMFONT
  2082. *
  2083. * OK text for the error requester
  2084. *
  2085. ok:     dc.b    0,0,RP_JAM1,0           ; last byte is kludgefill
  2086.         dc.w    6,4
  2087.         dc.l    TOPAZ_80,oktext,0
  2088.  
  2089.         even
  2090.  
  2091.  
  2092.  
  2093.